package src.linkeLlist;

// 注：链表的索引从0开始
// 向后移动p时，最好作while循环，不要用for循环
public class MyLinkedList {
    int size;
    ListNode dummy;  //虚拟头结点

    public MyLinkedList() {
        size = 0;
        dummy = new ListNode(0);
    }

    // 1.获取链表第index个节点的数值
    public int get(int index) {
        if (index < 0 || index >= size) {
            return -1;
        }
        ListNode p = dummy;
        for (int i = 0; i <= index; i++) {
            p = p.next;
        }
        return p.val;

    }

    // 2.在链表的最前面插入一个节点,头插法
    public void addAtHead(int val) {
        ListNode newNode = new ListNode(val);
        newNode.next = dummy.next;
        dummy.next = newNode;
        size++;

    }

    // 3.在链表的最后面插入一个节点，尾插
    public void addAtTail(int val) {
        ListNode newNode = new ListNode(val);
        ListNode p = dummy;
        while (p.next != null) {
            p = p.next;
        }
        p.next = newNode;
        size++;

    }

    // 4.在链表第index个节点前面插入一个节点
    public void addAtIndex(int index, int val) {
        ListNode newNode = new ListNode(val);
        ListNode p = dummy;
        if (index > 0 && index < size) {    //找到前一个结点
            for (int i = 0; i < index; i++) {
                p = p.next;
            }
            newNode.next = p.next;
            p.next = newNode;
        }
        size++;

    }

    // 5.删除链表的第index个节点
    public void deleteAtIndex(int index) {
        //找到待删除node的前一个结点
        if (index > 0 && index < size) {
            ListNode p = dummy;
            for (int i = 0; i < index; i++) {
                p = p.next;
            }
            p.next = p.next.next;
        }
        size--;

    }
}
